package com.hzit.manager.service.impl;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphO;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.hzit.manager.handler.HzitBlockHandler;
import com.hzit.manager.handler.HzitFallBackHandler;
import com.hzit.manager.service.SentinelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@Service
@Slf4j
public class SentinelServiceImpl implements SentinelService {
	@Override
	public void res1() {
		// 1.5.0 版本开始可以利用 try-with-resources 特性（使用有限制）
		// 资源名可使用任意有业务语义的字符串，比如方法名、接口名或其它可唯一标识的字符串。
		try (Entry entry = SphU.entry("res1")) {
			// 被保护的业务逻辑
			log.info("资源res1.");
		} catch (BlockException ex) {
			// 资源访问阻止，被限流或被降级
			// 在此处进行相应的处理操作
			log.error("资源res1限流异常！");
		}
	}

	@Override
	public void res2() {
		// 资源名可使用任意有业务语义的字符串
		if (SphO.entry("res2")) {
			// 务必保证finally会被执行
			try {
				/**
				 * 被保护的业务逻辑
				 */
			} finally {
				SphO.exit();
			}
		} else {
			// 资源访问阻止，被限流或被降级
			// 进行相应的处理操作
			log.error("资源res2限流异常！");
		}
	}

	/**
	 * 使用@SentinelResource注解定义资源
	 */
	@Override
	// @SentinelResource注解官方地址：https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
	// @SentinelResource(value = "res3",blockHandler = "blockHandlerRes3",blockHandlerClass = HzitBlockHandler.class)
	@SentinelResource(value = "res3",fallback = "fallBackRes3",fallbackClass = HzitFallBackHandler.class)
	public void res3() {
		int i = 10 / 0;
		log.info("正在访问资源res3.");
	}

	// public void fallBackRes3(Throwable e){
	// 	log.error("fallBack-->资源res3异常！");
	// }
	// public void blockHandlerRes3(BlockException ex){
	// 	log.error("资源res3限流异常！");
	// }
}
